package com.xt.base.environment;

import java.io.Serializable;

import org.apache.commons.lang.StringUtils;

import com.xt.base.reflection.BaseReflector;

/**
 * 环境提供器接口<br>
 * 
 * <p>
 * <a href="EnvironmentProvider.java.html"><i>查看源文件</i></a>
 * </p>
 * 
 * @author 杨洪波
 * @version $Revision: $<br>
 *          $Id: $
 */
public interface EnvironmentProvider extends Serializable{

	/** 
	 * 提供环境组
	 * 
	 * @return 环境组
	 *  */
	abstract public Environment[] provid();

	/** 
	 * 添加环境
	 * 
	 * @return 环境组
	 *  */
	abstract public void add(Environment env);

	/** 
	 * 根据类型查找环境
	 * @param type 要查找环境的类型
	 * @return 环境
	 *  */
	abstract public <V> Environment<V> get(Class<V> type);

	/** 
	 * 根据名称查找环境
	 * @param type 要查找环境的名称
	 * @return 环境
	 *  */
	abstract public <V> Environment<V> get(String name);
	
	public abstract class Default implements EnvironmentProvider{

		protected Environment[] envs;
		
		public void add(Environment env) {
			if (env != null && get(env.environment.getClass()) == null) {
				Environment[] temp = new Environment[envs.length + 1];
				temp[0] = env;
				System.arraycopy(envs, 0, temp, 1, envs.length);
				envs = temp;
			}
		}

		@SuppressWarnings("unchecked")
		public <V> Environment<V> get(Class<V> type) {
			if (type != null) {
				for (Environment env : envs) {
					if (BaseReflector.is(env.type, type))
						return env;
				}
			}
			return null;
		}

		@SuppressWarnings("unchecked")
		public <V> Environment<V> get(String name) {
			if (!StringUtils.isEmpty(name)) {
				for (Environment env : envs) {
					if (env.name.equals(name))
						return env;
				}
			}
			return null;
		}

		public Environment[] provid() {
			return envs;
		}
		
	}
}
